.\"
.\" Copyright (c) 2020 Apple Inc. All rights reserved.
.\"
.\" @APPLE_OSREFERENCE_LICENSE_HEADER_START@
.\"
.\" This file contains Original Code and/or Modifications of Original Code
.\" as defined in and that are subject to the Apple Public Source License
.\" Version 2.0 (the 'License'). You may not use this file except in
.\" compliance with the License. The rights granted to you under the License
.\" may not be used to create, or enable the creation or redistribution of,
.\" unlawful or unlicensed copies of an Apple operating system, or to
.\" circumvent, violate, or enable the circumvention or violation of, any
.\" terms of an Apple operating system software license agreement.
.\"
.\" Please obtain a copy of the License at
.\" http://www.opensource.apple.com/apsl/ and read it before using this file.
.\"
.\" The Original Code and all software distributed under the License are
.\" distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
.\" EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
.\" INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
.\" FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
.\" Please see the License for the specific language governing rights and
.\" limitations under the License.
.\"
.\" @APPLE_OSREFERENCE_LICENSE_HEADER_END@
.\"
.\"     @(#)vsock.4 7/9/2020
.\"
.Dd July 9, 2020
.Dt VSOCK 4
.Os macOS
.Sh NAME
.Nm vsock
.Nd VM Sockets
.Sh SYNOPSIS
.In sys/socket.h
.In sys/vsock.h
.Ft int
.Fn socket AF_VSOCK SOCK_STREAM 0
.Sh DESCRIPTION
The
.Tn vsock
protocol allows for socket communication between a virtual machine and its host. Socket connections may be established using standard socket interfaces. Currently, only stream connections from a guest are supported using this protocol.
.Pp
.Ss "Non-blocking connect"
When a
.Tn vsock
socket is set non-blocking, and the connection cannot be established immediately,
.Xr connect 2
returns with the error
.Dv EINPROGRESS ,
and the connection is established asynchronously.
.Pp
When the asynchronous connection completes successfully,
.Xr select 2
or
.Xr poll 2
or
.Xr kqueue 2
will indicate the file descriptor is ready for writing.
If the connection encounters an error, the file descriptor
is marked ready for both reading and writing, and the pending error
can be retrieved via the socket option
.Dv SO_ERROR .
.Pp
Note that even if the socket is non-blocking, it is possible for the connection
to be established immediately. In that case
.Xr connect 2
does not return with
.Dv EINPROGRESS .
.Sh ADDRESSING
Sockets bound to the vsock protocol family utilize
the following addressing structure which can be found in the header
.Aq Pa sys/vsock.h .
.Bd -literal -offset indent
struct sockaddr_vm {
	uint8_t 	svm_len;
	sa_family_t	svm_family;
	uint16_t	svm_reserved1;
	uint32_t	svm_port;
	uint32_t	svm_cid;
};
.Ed
.Pp
Addresses consist of a cid and a port.
The field
.Ar svm_len
contains the total length of the structure, while the field
.Ar svm_family
contains the value
.Fa AF_VSOCK .
The field
.Fa svm_reserved1
is reserved and should be set to zero.
.Pp
Sockets may be created with the local address
.Dv VMADDR_CID_ANY
to effect
.Dq wildcard
matching on incoming messages.
The address in a
.Xr connect 2
call may be given as
.Dv VMADDR_CID_ANY
to mean
.Dq this host .
The cid addresses
.Dv VMADDR_CID_HYPERVISOR
or
.Dv VMADDR_CID_HOST
may be used to
.Xr connect 2
or
.Xr bind 2
to the hypervisor or host respectively.
.Dv VMADDR_PORT_ANY
may be used to obtain the next available free port when calling
.Xr bind 2 .
.Ss CID Constants
.Bl -tag -width ".Dv VMADDR_CID_HYPERVISOR"
.It Dv VMADDR_CID_ANY
Wildcard matches any address.
.It Dv VMADDR_CID_HYPERVISOR
The address of the hypervisor.
.It Dv VMADDR_CID_HOST
The address of the host.
.El
.Ss Port Constants
.Bl -tag -width ".Dv VMADDR_CID_HYPERVISOR"
.It Dv VMADDR_PORT_ANY
Wildcard matches any port.
.El
.Sh ERRORS
A
.Tn vsock
socket operation may fail with a general socket error or one of the following
.Tn vsock
specific errors:
.Bl -tag -width ".It Bq Er EADDRNOTAVAIL"
.It Bq Er EACCES
returned by
.Xr bind 2
when attempting to bind to a privileged port;
.It Bq Er EADDRINUSE
returned by
.Xr bind 2
when attempting to bind to a cid and port that is already in use;
.It Bq Er EADDRNOTAVAIL
returned by
.Xr bind 2
when attempting to bind to an invalid cid or port;
.It Bq Er EFAULT
returned by
.Xr connect 2
when attempting to connect to an invalid cid;
.It Bq Er EINPROGRESS
returned by
.Xr connect 2
when attempting to connect using a non-blocking socket;
.It Bq Er EINVAL
when passing an invalid parameter;
.It Bq Er ENODEV
when a vsock transport does not exist;
.It Bq Er ENOTCONN
when performing an operation on a non-connected socket;
.It Bq Er ETIMEDOUT
returned by
.Xr connect 2
when a connection attempt has timed out;
.It Bq Er EWOULDBLOCK
returned by
.Xr send 2
or
.Xr recv 2
when sending or receiving using a non-blocking socket.
.El
.Sh IOCTLS
The
.Xr ioctl 2
command codes below are defined in
.Aq Pa sys/vsock.h .
All commands require
these includes:
.Bd -literal
        #include <sys/ioctl.h>
        #include <sys/vsock.h>
.Ed
.Pp
The third argument to
.Xr ioctl 2
should be a pointer to the type indicated in parenthesis.
.Bl -tag -width IOCTL_VM_SOCKETS_GET_LOCAL_CID
.It Dv IOCTL_VM_SOCKETS_GET_LOCAL_CID
.Pq Li uint32_t
Returns the local cid of this socket's transport.
.El
.Sh SEE ALSO
.Xr bind 2 ,
.Xr connect 2 ,
.Xr ioctl 2 ,
.Xr kqueue 2 ,
.Xr poll 2 ,
.Xr select 2 ,
.Xr socket 2
